home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 May: Tool Chest / Developer CD Series Tool Chest (Apple Computer)(May 1999).iso / Tool Chest / Networking / MacTCP / MacTCP Developer Tools / 802 LAP / LAPloopback.a < prev    next >
Encoding:
Text File  |  1993-06-15  |  3.1 KB  |  120 lines  |  [TEXT/MPS ]

  1. ;********************************************************************
  2. ;   (c) Copyright 1990-91 by Apple Computer, Inc.  All rights reserved.
  3. ;
  4. ;    LAPloopBack.a implements a software loopback function for IP
  5. ;********************************************************************
  6.  
  7.     TITLE    'LAPloopBack'
  8.     CASE    OBJECT
  9.  
  10. ;
  11. ;    1.2        11/29/90 Rajesh - modified for IEEE 802.3 LAP
  12. ;
  13.  
  14.         INCLUDE        'SysErr.a'
  15.         INCLUDE        'SysEqu.a'
  16.         INCLUDE        'ToolEqu.a'
  17.         INCLUDE        'Traps.a'
  18.  
  19.         IMPORT    Lap802_read_ph
  20.  
  21. LAPHeaderSize    EQU        22
  22. SCCLockout        EQU        $2600
  23.  
  24. ;
  25. ; TLoopBack(wds)
  26. ; struct wdsEntry *wds;
  27. ; Implements the loopback function for IP.  When control returns to caller,
  28. ; the packet has been processed by the input side.  Caller responsible for 
  29. ; doing output IO completion
  30. ;
  31. TLoopBack    PROC    EXPORT
  32. ;
  33. ; handle loop-backs by setting up the registers to look like the 
  34. ; Lap802_read_ph was called by the driver
  35.        
  36.         movem.l    a2-a4,-(sp)
  37. ARG1    SET    3*4+4                        ;&IPB->laphdr
  38.         move.l    ARG1(sp),a0                ;Get pointer to ipb's 1st WDS
  39. ;
  40. ; A0 - pointer to current WDS entry */
  41. ; A1 - number of bytes left in current WDS entry */
  42. ; A2 - pointer to next byte to copy */
  43. ; A3 - pointer to first byte past IEEE 802.3 header */
  44. ; A4 - pointer to CopyPacket */
  45. ;
  46. ;        pea        #'TLoopBack'
  47. ;        _DebugStr
  48.         
  49.         move.l    2(a0),a3                ;Get Pointer to IEEE 802.3 header
  50.         add.l    #LAPHeaderSize,a3        ;Point past start of header, header
  51.                                         ;size = 22 bytes - RAJESH NOV 20,1990
  52.         add.l    #6,a0                    ;advance to next WDS
  53. ;        
  54. ; compute remaining length of packet
  55. ;
  56.         move.l    a0,-(sp)                ;save WDS pointer
  57.         clr.l    d1
  58. @1        add.w    (a0),d1                    ;add in length of this WDS entry
  59.         add.l    #6,a0                    ;advance to next WDS
  60.         move.w    (a0),d0
  61.         bne.s    @1                        ;if not end of WDS, loop
  62.         move.l    (sp)+,a0
  63.         
  64.         move.w    (a0),a1                    ;Get length of entry
  65.         move.l    2(a0),a2                ;and pointer to its data
  66.         lea.l    CopyPacket, a4            ;Get addr of copy routine
  67.         move.w    sr,-(sp)                ;Save current interrupt status
  68.         move.w    #SCCLockout,sr            ;and disable interrupts
  69.         jsr        Lap802_read_ph            ;call IEEE 802.3 packet read handler
  70.         move.w     (sp)+,sr                ;replace status register
  71.         movem.l    (sp)+,a2-a4
  72.         rts
  73.  
  74.  
  75.  
  76. CopyPacket    bra.s    Cpkt
  77.  
  78. CopyRest
  79. ;
  80. ; transfer the remaining bytes in the looped WDS to the input buffer
  81. ;
  82. ; A3 - input buffer pointer
  83. ; D3 - size of buffer
  84. ;
  85. ; A0 - pointer to current WDS entry */
  86. ; A1 - number of bytes left in current WDS entry */
  87. ; A2 - pointer to next byte to copy */
  88. ; A3 - pointer to first byte past IEEE 802.3 header */
  89. ; A4 - pointer to CopyPacket */
  90. ;
  91. Cpkt
  92. ;        pea        #'Cpkt'
  93. ;        _DebugStr
  94.         tst        d3                    ;zero requested size
  95.         beq.s    @3                    ;if so, complete immediately
  96.         move.w    a1,d0
  97.         beq.s    @3
  98. @1        move.b    (a2)+,(a3)+            ;transfer one byte
  99.         sub.w    #1,d3                ;decrement input buffer length
  100.         sub.w    #1,a1                ;decrement current wds length
  101.         move.w    a1,d0
  102.         bne.s    @2                    ;if not finished with this wds, skip
  103. ;
  104. ; advance to next WDS entry
  105. ;
  106.         add.l    #6,a0                ;point to next WDS entry
  107.         move.w    (a0), a1            ;get its length
  108.         move.w    a1,d0
  109.         beq.s    @3                    ;if zero, copy is finished
  110.         move.l    2(a0), a2            ;and get buffer pointer
  111.  
  112. @2        tst.w    d3                    ;decrement input buffer length
  113.         bne.s    @1                    ;if room left, loop
  114. @3        move.w  d3,d0
  115.         rts    
  116.     
  117.         ENDPROC
  118.         END    
  119.